package com.meterhuang;

import lombok.extern.slf4j.Slf4j;

/**
 * 检查二进制字符串字段
 *给你一个二进制字符串 s ，该字符串不含前导零
 * 如果 s 最多包含 一个由连续的 '1' 组成的字段 ，返回 true。否则，返回 false
 *
 * 示例 1：
 * 输入：s = "1001"
 * 输出：false
 * 解释：字符串中的 1 没有形成一个连续字段。
 *
 * 来源：https://leetcode-cn.com/problems/check-if-binary-string-has-at-most-one-segment-of-ones
 *
 *
 * @author meterhuang
 * @date 2021/04/09 10:01
 */
@Slf4j
public class CheckOneSegment {

	private static final String BIT_1 = "1";
	private static final String BIT_11 = "11";
	private static final String BIT_10 = "10";
	private static final String BIT_01 = "01";
	private static final char CHAR_1 = '1';

	public static void main(String[] args) {
		// 根据题意字符串以"1"开头
		// 有"1"但不连续：false
		// 只有一个"1"且在开头位置：true
		// 特殊情况：最多包含一个由连续的'1'组成的字段，如果字符串为"1"也符合要求
		boolean b = checkOneSegment("1010011");
		log.info("result: {}", b);
		b = checkOneSegmentV2("100100011");
		log.info("result 2: {}", b);
	}

	public static boolean checkOneSegment(String s) {
		// 没有连续1，只有开头单个1存在
		if (s.equals(BIT_1)) {
			return true;
		}
		if (s.charAt(0) == CHAR_1) {
			String substring = s.substring(1);
			if (substring.indexOf(BIT_1) == -1) {
				return true;
			}
		}
		// 只有一个连续11存在，且11必须在开头,后面没有单独的字符1
		int i = s.indexOf(BIT_11);
		if (i > 0) {
			return false;
		}
		int j = s.lastIndexOf(BIT_11);
		if (s.substring(j + 2).indexOf(BIT_1) > 0) {
			return false;
		}
		if (s.length() <= 4) {
			return true;
		}
		for (int k = 2; k < j; ++k) {
			char ch = s.charAt(k);
			if (ch == '0') {
				return false;
			}
		}
		return true;
	}

	public static boolean checkOneSegmentV2(String s) {
		if (s.equals(BIT_1)) {
			return true;
		}
		if (s.startsWith(BIT_10)) {
			if (s.indexOf(BIT_11) > 0) {
				return false;
			}
			if (s.indexOf(BIT_01) > 0) {
				return false;
			}
		}
		if (s.startsWith(BIT_11)) {
			if (s.indexOf(BIT_01) > 0) {
				return false;
			}
		}

		return true;
	}
}
